كيف تستخدم بنى التحكم (Flow Control) في سكربتات الصدفة (Shell Scripts) – الجزء الأول
تُعد سكربتات الصدفة (Shell Scripts) من الأدوات الجوهرية في إدارة أنظمة التشغيل الشبيهة بيونكس مثل Linux وUnix. ومن أهم مفاتيح كتابة سكربتات فعالة وقوية القدرة على التحكم في تدفق التنفيذ داخل هذه السكربتات. تتجلى أهمية بنى التحكم (Flow Control) في إمكانية توجيه تنفيذ الأوامر وفق شروط معينة، أو تكرار تنفيذ أجزاء من السكربت، أو التعامل مع مدخلات ومخرجات متعددة بطريقة منطقية ومدروسة. يمكن تشبيه بنى التحكم بهيكل عظمي يمنح السكربت صلابته ومرونته في آن واحد.
يتناول هذا المقال الجزء الأول من استخدام بنى التحكم في سكربتات الصدفة، مع تقديم شرح موسع للبُنى الأساسية مثل: التفرع الشرطي (if/then/else)، جملة case، الحلقات (loops)، وجمل التحكم break وcontinue، مدعوماً بالأمثلة والشروحات الفنية الضرورية.
1. التفرع الشرطي if/then/else
تُستخدم البنية الشرطية if في سكربتات الصدفة لاتخاذ قرار مبني على تحقق شرط معين. يعتبر هذا النوع من أبسط وأهم الأدوات لتوجيه سير تنفيذ السكربت.
الصيغة الأساسية:
bashif [ شرط ]; then
أوامر عند تحقق الشرط
else
أوامر عند عدم تحقق الشرط
fi
مثال تطبيقي:
bash#!/bin/bash
echo "أدخل رقم:"
read num
if [ $num -gt 0 ]; then
echo "الرقم موجب"
else
echo "الرقم غير موجب"
fi
في هذا المثال يتم فحص ما إذا كان الرقم المدخل أكبر من الصفر، وفي حال تحقق الشرط تتم طباعة “الرقم موجب”، وإلا تطبع “الرقم غير موجب”.
ملاحظة فنية:
-
يجب استخدام فراغات حول الأقواس المربعة
[و]. -
عند التعامل مع أرقام، يتم استخدام المعاملات مثل
-eq،-ne،-gt،-lt،-ge، و-le. -
عند التعامل مع نصوص، يتم استخدام
=,!=,-z,-n.
2. التفرع المتعدد if/elif/else
عندما يتطلب البرنامج اختبار عدة حالات مختلفة يمكن استخدام البنية التالية:
bashif [ شرط1 ]; then
أوامر1
elif [ شرط2 ]; then
أوامر2
else
أوامر افتراضية
fi
مثال تطبيقي:
bash#!/bin/bash
echo "أدخل درجة الطالب:"
read grade
if [ $grade -ge 90 ]; then
echo "التقدير: ممتاز"
elif [ $grade -ge 75 ]; then
echo "التقدير: جيد جداً"
elif [ $grade -ge 60 ]; then
echo "التقدير: جيد"
else
echo "التقدير: راسب"
fi
3. استخدام جملة case
تُستخدم جملة case كبديل أنيق للبنية الشرطية عندما تكون هناك حاجة لاختبار قيمة واحدة مقابل عدة قيم محتملة.
الصيغة العامة:
bashcase قيمة in
نمط1)
أوامر
;;
نمط2)
أوامر
;;
*)
أوامر افتراضية
;;
esac
مثال تطبيقي:
bash#!/bin/bash
echo "أدخل اسم اليوم:"
read day
case $day in
"السبت"|"الأحد")
echo "بداية الأسبوع"
;;
"الخميس"|"الجمعة")
echo "نهاية الأسبوع"
;;
*)
echo "يوم في وسط الأسبوع"
;;
esac
يُفيد هذا النوع من التفرعات في تصنيف القيم ضمن مجموعات بطريقة نظيفة ومنظمة.
4. الحلقات التكرارية (Loops)
الحلقات تُستخدم لتنفيذ مجموعة من الأوامر بشكل متكرر، سواءً لعدد معين من المرات أو طالما تحقق شرط معين.
4.1 الحلقة for
تُستخدم عندما يكون هناك عدد معروف من التكرارات.
الصيغة الأساسية:
bashfor var in قائمة
do
أوامر
done
مثال:
bash#!/bin/bash
for name in "علي" "سارة" "فهد"
do
echo "مرحباً $name"
done
4.2 الحلقة while
تُستخدم عندما يكون التكرار مشروطاً بتحقق شرط معين.
الصيغة:
bashwhile [ شرط ]
do
أوامر
done
مثال:
bash#!/bin/bash
count=1
while [ $count -le 5 ]
do
echo "العد: $count"
((count++))
done
4.3 الحلقة until
تعمل بشكل معاكس لـ while، حيث تستمر الحلقة حتى يتحقق الشرط.
الصيغة:
bashuntil [ شرط ]
do
أوامر
done
مثال:
bash#!/bin/bash
num=1
until [ $num -gt 5 ]
do
echo "الرقم هو $num"
((num++))
done
5. التحكم في الحلقات: break و continue
5.1 جملة break
تُستخدم لإنهاء الحلقة فوراً عند تحقق شرط معين.
مثال:
bashfor i in {1..10}
do
if [ $i -eq 5 ]; then
break
fi
echo $i
done
5.2 جملة continue
تُستخدم لتخطي التكرار الحالي من الحلقة والانتقال إلى التكرار التالي.
مثال:
bashfor i in {1..5}
do
if [ $i -eq 3 ]; then
continue
fi
echo $i
done
6. مقارنة بين أنواع الحلقات
| النوع | أفضل استخدام | يُنهي بالشرط | يُبدأ بتكرار محدد |
|---|---|---|---|
for |
تكرار محدد العناصر | لا | نعم |
while |
شرط غير ثابت | نعم | لا |
until |
شرط غير ثابت معكوس | نعم | لا |
7. الاعتبارات الأمنية والمهنية
عند استخدام بنى التحكم، من المهم مراعاة النقاط التالية:
-
التحقق من المدخلات: يجب دوماً التحقق من القيم التي يدخلها المستخدم لتفادي تنفيذ أوامر ضارة.
-
الاستخدام الآمن للمتغيرات: يفضل إحاطة المتغيرات بعلامات اقتباس
" "لتفادي تأثير المسافات البيضاء أو القيم الفارغة. -
عدم الاعتماد على الملفات الخارجية بشكل مباشر ما لم يتم التحقق من وجودها وصلاحيات الوصول إليها.
-
تحديد نطاق المتغيرات داخل الحلقات لتفادي تأثيرها على أجزاء أخرى من السكربت.
خاتمة تقنية للجزء الأول
تناول هذا الجزء المفصل من المقال الأساسيات الجوهرية للتحكم في تدفق التنفيذ داخل سكربتات الصدفة. تُعد هذه المفاهيم هي الركائز التي تُبنى عليها السكربتات الأكثر تعقيداً، كما تسمح بإنشاء منطق برمجي واضح، مرن، وآمن. تعتبر بنى التحكم عنصرًا لا غنى عنه لأي مطور أو مدير نظام يتعامل مع البيئة الشبيهة بيونكس، حيث تشكل الفرق بين سكربت بدائي وآخر ذكي وقابل للتوسع.
سيتم في الجزء الثاني التعمق في مفاهيم أكثر تقدماً مثل التحكم في التدفق باستخدام الدوال، إدارة الأخطاء، جمل select التفاعلية، وآليات المعالجة المتوازية باستخدام & وwait، وذلك لتوسيع الأفق البرمجي والتحكم الكامل في تنفيذ السكربتات.
المصادر والمراجع:
-
William E. Shotts Jr., The Linux Command Line, No Starch Press

